/*Diego Lima de Freitas RA: 317632
 *Yuri Souza Padua RA: 317420
 * 
 * Classe principal do compilador que lê a entrada e inicia as chamadas
 */
package compiler;

import AST.PW;
import AST.Program;
import java.io.*;

public class Main {

    public static void main(String[] args) {

        File file;
        FileReader stream;
        int numChRead;
        Program program;

        if (args.length != 1 && args.length != 2) {
            System.out.println("Uso:\n   Main input [output]");
            System.out.println("Entrada é o arquivo a ser compilado");
            System.out.println("A saída é o arquivo onde o código gerado será armazendo");
        } else {
            file = new File(args[0]);
            if (!file.exists() || !file.canRead()) {
                System.out.println("Ou o arquivo " + args[0] + " não existe ou não pode ser lido");
                return;
            }
            try {
                stream = new FileReader(file);
            } catch (FileNotFoundException e) {
                System.out.println("Algo errado: arquivo não existe mais");
                throw new RuntimeException();
            }
            
            char[] input = new char[(int) file.length() + 1];

            try {
                numChRead = stream.read(input, 0, (int) file.length());
            } catch (IOException e) {
                System.out.println("Erro lendo arquivo " + args[0]);
                return;
            }

            if (numChRead != file.length()) {
                System.out.println("Erro de leitura");
                return;
            }
            try {
                stream.close();
            } catch (IOException e) {
                System.out.println("Erro na manipulação do arquivo " + args[0]);
                return;
            }


            Compiler compiler = new Compiler();

            String outputFileName;
            if (args.length == 2) {
                outputFileName = args[1];
            } else {
                outputFileName = args[0];
                int lastIndex;
                if ((lastIndex = outputFileName.lastIndexOf('.')) == -1) {
                    lastIndex = outputFileName.length();
                }
                StringBuffer sb = new StringBuffer(outputFileName.substring(0, lastIndex));
                sb.append(".c");
                outputFileName = sb.toString();
            }

            FileOutputStream outputStream;
            try {
                outputStream = new FileOutputStream(outputFileName);
            } catch (IOException e) {
                System.out.println("File " + args[1] + " was not found");
                return;
            }
            PrintWriter printWriter = new PrintWriter(outputStream);
            program = null;
            
            program = compiler.compile(input, new PrintWriter(System.out));

            if (program != null) {
                PW pw = new PW();
                pw.set(printWriter);
                program.genC(pw);
                if (printWriter.checkError()) {
                    System.out.println("There was an error in the output");
                }
            }
        }
    }
}
